Filter bootloader supplied kernel cmdline options
authorSjoerd Simons <sjoerd@luon.net>
Sun, 30 Oct 2016 20:06:27 +0000 (21:06 +0100)
committerAtomic Bot <atomic-devel@projectatomic.io>
Tue, 1 Nov 2016 18:00:37 +0000 (18:00 +0000)
Various bootloader add kernel commandline options dynamically, filter
these out when grabbing boot options from /proc/cmdline. Specifically
grub adds BOOT_IMAGE and systemd-boot adds initrd.

Closes: #560
Approved by: cgwalters

src/libostree/ostree-kernel-args.c
src/libostree/ostree-kernel-args.h
tests/test-admin-deploy-karg.sh
tests/test-admin-instutil-set-kargs.sh

index ec189fc191a01239654c690a6919a28add7f717f..22b5caa76c60f8cd7cac3d1bdb95d2971d8d955a 100644 (file)
@@ -53,6 +53,23 @@ split_keyeq (char *arg)
     }
 }
 
+static gboolean
+_arg_has_prefix (const char *arg,
+                 char      **prefixes)
+{
+  char **strviter;
+
+  for (strviter = prefixes; strviter && *strviter; strviter++)
+    {
+      const char *prefix = *strviter;
+
+      if (g_str_has_prefix (arg, prefix))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 OstreeKernelArgs *
 _ostree_kernel_args_new (void)
 {
@@ -154,18 +171,28 @@ _ostree_kernel_args_replace_argv (OstreeKernelArgs  *kargs,
 }
 
 void
-_ostree_kernel_args_append_argv (OstreeKernelArgs  *kargs,
-                                 char            **argv)
+_ostree_kernel_args_append_argv_filtered (OstreeKernelArgs  *kargs,
+                                          char             **argv,
+                                          char             **prefixes)
 {
   char **strviter;
 
   for (strviter = argv; strviter && *strviter; strviter++)
     {
       const char *arg = *strviter;
-      _ostree_kernel_args_append (kargs, arg);
+
+      if (!_arg_has_prefix (arg, prefixes))
+        _ostree_kernel_args_append (kargs, arg);
     }
 }
 
+void
+_ostree_kernel_args_append_argv (OstreeKernelArgs  *kargs,
+                                 char             **argv)
+{
+  _ostree_kernel_args_append_argv_filtered (kargs, argv, NULL);
+}
+
 gboolean
 _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs,
                                          GCancellable     *cancellable,
@@ -175,6 +202,13 @@ _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs,
   g_autofree char *proc_cmdline = NULL;
   gsize proc_cmdline_len = 0;
   g_auto(GStrv) proc_cmdline_args = NULL;
+  /* When updating the filter list don't forget to update the list in the tests
+   * e.g. tests/test-admin-deploy-karg.sh and
+   * tests/test-admin-instutil-set-kargs.sh
+   */
+  char *filtered_prefixes[] = { "BOOT_IMAGE=", /* GRUB 2 */
+                                "initrd=", /* sd-boot */
+                                NULL };
 
   if (!g_file_load_contents (proc_cmdline_path, cancellable,
                              &proc_cmdline, &proc_cmdline_len,
@@ -184,7 +218,8 @@ _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs,
   g_strchomp (proc_cmdline);
 
   proc_cmdline_args = g_strsplit (proc_cmdline, " ", -1);
-  _ostree_kernel_args_append_argv (kargs, proc_cmdline_args);
+  _ostree_kernel_args_append_argv_filtered (kargs, proc_cmdline_args,
+                                            filtered_prefixes);
 
   return TRUE;
 }
index 18710d783c4f355fd3abd782bb684dd57d9f7146..ceaa1ca782e4e4ddf8ebb703e2acf24441ac9892 100644 (file)
@@ -39,6 +39,9 @@ void _ostree_kernel_args_append (OstreeKernelArgs  *kargs,
                                  const char     *key);
 void _ostree_kernel_args_append_argv (OstreeKernelArgs  *kargs,
                                       char **argv);
+void _ostree_kernel_args_append_argv_filtered (OstreeKernelArgs  *kargs,
+                                               char **argv,
+                                               char **prefixes);
 
 gboolean _ostree_kernel_args_append_proc_cmdline (OstreeKernelArgs *kargs,
                                                   GCancellable     *cancellable,
index b7305f4cca9f28ab89b77b9ca607c378908960f7..643aef783f07b634db06ca4a80f27f8fa3ebd449 100755 (executable)
@@ -46,6 +46,8 @@ ${CMD_PREFIX} ostree admin deploy --karg-proc-cmdline --os=testos testos:testos/
 for arg in $(cat /proc/cmdline); do
     case "$arg" in
        ostree=*) # Skip ostree arg that gets stripped out
+         ;;
+       initrd=*|BOOT_IMAGE=*) # Skip options set by bootloader that gets filtered out
           ;;
        *) assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf "options.*$arg"
           ;;
index 40f4b74683b143f452e194cb81b37b737745ca37..132c933679dff27264b4ed0dfbdd855e6f109671 100755 (executable)
@@ -58,6 +58,8 @@ for arg in $(cat /proc/cmdline); do
     case "$arg" in
        ostree=*) # Skip ostree arg that gets stripped out
           ;;
+       initrd=*|BOOT_IMAGE=*) # Skip options set by bootloader that gets filtered out
+          ;;
        *) assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf "options.*$arg"
           ;;
     esac